package com.example.myapplication.reflect;

import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi;

import com.example.myapplication.mvvm.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

public class Reflect {



    @RequiresApi(api = Build.VERSION_CODES.O)
    public static void getReflect(){

        //  获取类名的三种方法
        Person p = new Person();
        Class<? extends Person> c = p.getClass();
        try {
            Class<?> c2 = Class.forName("com.example.myapplication.mvvm.Person");
            Class<Person> c3 = Person.class;
//            Log.e("三个值是否相同", (c == c2)   +  "      "  + (c3 == c2));

            Constructor<?>[] list = c.getDeclaredConstructors();//  获取所有的构造方法（包括私有和公有）
            for (Constructor<?> name : list) {
//                Log.e("三个值是否相同   构造方法 ", name   +  "    有几个参数  "  + name.getParameterCount());
            }

            try {
                Constructor constructor = c.getDeclaredConstructor();
                constructor.setAccessible(true);//  设置禁止查询访问权限(公有和私有方法有可以)
                Person person1 = (Person)constructor.newInstance();//  调用无参构造方法
                Field falseName = c.getDeclaredField("falseName");//  获取成员变量名字
                Field falseName2 = c.getDeclaredField("list");//  获取成员变量名字
                 falseName.setAccessible(true);// 设置禁止查询访问权限(公有和私有方法有可以)
                 Person ps = new Person();
                 falseName.set(ps,"三个值是否相同");//  为成员变量设置值
                String o = (String) falseName.get(ps);// 获取成员变量的值
                Method setFalseName = c.getDeclaredMethod("setFalseName", String.class);//  拿到指定的方法
                    setFalseName.setAccessible(true);
                    //  返回来的数据          调用指定的方法
                Object setFalseNamelll = setFalseName.invoke(ps, "调用setFalseName方法并且传当前的参数");

                Log.e("三个值是否相同   成员变量名称 ", falseName.getName()   +  "    成员变量类型  "  + falseName.getType());
                Log.e("三个值是否相同   成员变量名称 ", falseName2.getName()   +  "    成员变量类型  "  + falseName2.getType());


                Constructor constructor2 = c.getDeclaredConstructor(String.class,String.class, List.class);
                constructor2.setAccessible(true);
                Person person2 = (Person)constructor2.newInstance("构造方法", "有几个参数", null);
                Log.e("三个值是否相同   构造方法 ", constructor   +  "    有几个参数  "  + constructor.getParameterCount());
                Log.e("三个值是否相同   构造方法 ", constructor2   +  "    有几个参数  "  + constructor2.getParameterCount());

            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (NoSuchFieldException e) {
                throw new RuntimeException(e);
            }


        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }


    }


}
